// Either 函子  可处理异常 并在函子中记录出错信息
class Left {
    static of (value) {
        return new Left(value);
    }

    constructor (value) {
        this._value = value;
    }

    map (fn) {
        //返回调用的当前对象
        return this;
    }

}

class Right {
    static of (value) {
        return new Right(value);
    }

    constructor (value) {
        this._value = value;
    }

    map ( fn) {
        //返回调用得当前对象
        return Right.of(fn(this._value));
    }

}


// let r1 = Right.of(12).map(x => x + 2);
// let r2 = Left.of(12).map(x => x + 2);

// console.log(r1);
// console.log(r2);

//将字符串转换成JSON对象
function parseJSON (str) {
    //可能会出现异常  出现异常则不是纯函数
    try {
        //当无异常则使用Right函子进行下一步操作
        return Right.of(JSON.parse(str));
    } catch (e) {
        //当出现异常则使用Left函子记录异常信息
        return Left.of({ error: e.message})
    }
}

//出现异常时
// let r = parseJSON('{ name: zs}');
// console.log(r);
//结果： Left { _value: { error: 'Unexpected token n in JSON at position 2' } }

//当无异常时
let r = parseJSON('{ "name": "zs"}')
            .map(x => x.name.toUpperCase() );   
            //Right { _value: 'ZS' }
console.log(r);
//结果： Right { _value: { name: 'zs' } }